import java.io.*;
import org.jdom2.*;
import org.jdom2.input.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;

public class ParserFichierXML{
	private static Document doc;
	private static Element racine;
	private static List<Element> listeTaches;

	public static void parse(String fichier, Diagramme d) {
		SAXBuilder sxb = new SAXBuilder();

		try {
			doc = sxb.build(new File(fichier));
		} catch (Exception e) {
			e.printStackTrace();
		}

		racine = doc.getRootElement();
		listeTaches = racine.getChildren("tache");
		
		creerTacheRec(d);
		
		d.sort();
		eliminationDoublons(d);
		d.calculDatePlusTot();
		d.calculDatePlusTard();
	}

	//Ajout recursif de tache dans l'arrayList de tache du Diagramme
	public static void creerTacheRec(Diagramme d) {

		Iterator<Element> i = listeTaches.iterator();
		ArrayList<Tache> alT = d.getListe();

		while (i.hasNext()) {
			Element tache = (Element) i.next();

			char code = tache.getAttributeValue("code").charAt(0);
			
			if ( !alT.contains(d.getTacheParCode(code)) ) {

				String libelle = tache.getChild("libelle").getText();
				float duree = Float.parseFloat(tache.getChild("duree").getText());

				Tache t = new Tache(code, duree, libelle);

				d.ajTache(t);

				List<Element> listAnte = tache.getChildren("ante");
				Iterator<Element> j = listAnte.iterator();

				while (j.hasNext()) {
					Element anteCourant = (Element) j.next();

					Tache tCour = d.getTacheParCode(code);
					Tache tPrec = d.getTacheParCode(anteCourant.getText().charAt(0));
					
					if (tPrec == null) {
						creerTacheRec(d);
					}
					
					tPrec = d.getTacheParCode(anteCourant.getText().charAt(0));
					d.ajTachePrec(tCour, tPrec);
				}
			}
		}
	}

	// methode d'elimation des doublons par tache
	public static void eliminationDoublons(Diagramme d) {
		ArrayList<Tache> ante = new ArrayList<Tache>();
		ArrayList<Tache> anteOfAnte = new ArrayList<Tache>();

		ArrayList<Tache> listeTache = d.getListe();
		for ( Tache tCour : listeTache ) {
			
			ArrayList<Tache> listeTachePrecTCour = tCour.getPrec();
			for (Tache tPrec : listeTachePrecTCour) {
	
				ante.add(tPrec);
	
				ArrayList<Tache> listeTachePrecTPrec = tPrec.getPrec();
				for (Tache tPrecOfPrec : listeTachePrecTPrec) {
	
					if (!anteOfAnte.contains(tPrecOfPrec)) anteOfAnte.add(tPrecOfPrec);
				}
			}
	
			for (Tache tPrec : ante) {
				if (anteOfAnte.contains(tPrec)) {
					tCour.supprTachePrec(tPrec);
					tPrec.supprTacheSuiv(tCour);
				}
			}
		}
	}
}
